/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package managers;

import beans.PuntosAmigo;
import dao.PuntosAmigosDao;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import util.PuntajeAmigoTableModel;

/**
 *
 * @author nMoncho
 */
public class ManagerPuntajeAmigos {

    private List<PuntosAmigo> puntajes;
    private ArrayList<PuntosAmigo> puntosModelo;
    private PuntajeAmigoTableModel model;
    private List<PuntosAmigo> puntajesABorrar;
    private PuntosAmigo cargaActual;

    public ManagerPuntajeAmigos(){
        puntajes = PuntosAmigosDao.getPuntosAmigos();
        rellenarModelo();

        puntajesABorrar = new ArrayList<PuntosAmigo>();
    }

    private void rellenarModelo(){
        puntosModelo = new ArrayList<PuntosAmigo>();
        for(PuntosAmigo puntaje : puntajes){
            puntosModelo.add(puntaje);
        }
        model = new PuntajeAmigoTableModel(puntosModelo);
    }

    public AbstractTableModel getModel(){
        return model;
    }

    public boolean agregarPuntajeVacio() {
        if(isCargaActualValida()){
            PuntosAmigo puntaje = new PuntosAmigo();
            puntaje.setDescripcion("[Inserta descripcion aqui]");

            //Add
            cargaActual = puntaje;
            puntajes.add(puntaje);
            puntosModelo.add(puntaje);

            return true;
        }else
            return false;
        
    }

    public boolean isCargaActualValida(){
        if(cargaActual == null)
            return true;
        
        //Debe tener puntos cargados y mayores a 0
        if(cargaActual.getPuntos() == null || cargaActual.getPuntos() < 0)
            return false;
        //Si tiene una cantidad maxima (opcional), debe ser mayor a 0
        if(cargaActual.getCantidadMaxima() != null && cargaActual.getCantidadMaxima() < 0)
            return false;
        //Debe tener una cantidad minima, y debe ser mayor a cero
        if(cargaActual.getCantidadMinima() == null || cargaActual.getCantidadMinima() < 0)
            return false;

        //La cantidad minima debe ser menor igual a la cantidad maxima
        if(cargaActual.getCantidadMaxima() != null && cargaActual.getCantidadMaxima() < cargaActual.getCantidadMinima())
            return false;

        //Ver que no colisione ningun rango
        for(PuntosAmigo puntos : puntajes){
            if(puntos == cargaActual)
                continue;

            //No puede haber dos rangos con cotas superiores abiertas
            if(cargaActual.getCantidadMaxima() == null && puntos.getCantidadMaxima() == null)
                return false;


            if(puntos.getCantidadMaxima() != null){
                //Si es un intervalo cerrado
                if(cargaActual.getCantidadMinima() >= puntos.getCantidadMinima()
                        && cargaActual.getCantidadMinima() <= puntos.getCantidadMaxima()){
                    //Y el minimo de la carga esta dentro del rango
                    return false;
                }
                //O si la carga es un intervalo cerrado
                if(cargaActual.getCantidadMaxima()!= null
                        && cargaActual.getCantidadMaxima() >= puntos.getCantidadMinima()
                        && cargaActual.getCantidadMaxima() <= puntos.getCantidadMaxima()){
                    //Y el maximo de la carga esta dentro del rango
                    return false;
                }
            }else{
                if(cargaActual.getCantidadMinima() >= puntos.getCantidadMinima())
                    return false;
                if(cargaActual.getCantidadMaxima() != null && cargaActual.getCantidadMaxima() >= puntos.getCantidadMinima())
                    return false;
            }
        }

        return true;
    }

    public void eliminarPuntaje(int fila){
        PuntosAmigo puntaje = puntosModelo.get(fila);
        //Elimino de filas
        puntosModelo.remove(puntaje);
        puntajes.remove(puntaje);

        //Si no esta en DB (o sea es la carga actual)
        if(puntaje == cargaActual)
            cargaActual = null;
        else{// si esta en DB, lo agrego a la lista de borrado
            puntajesABorrar.add(puntaje);
        }
    }

    public boolean guardarCambios(){
        //Verificar Carga Actual
        if(!isCargaActualValida())
            return false;

        boolean exito = PuntosAmigosDao.saveOrUpdateOrDelete(puntajes, puntajesABorrar);

        //Si guardo, ya no es mas temporal, y debe ser borrado de la DB
        if(exito)
            cargaActual = null;

        return exito;
    }
}
